﻿// C.Permutation - 359B.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
C - https://codeforces.com/problemset/problem/359/B


题意
给定n,k，构造一个长度为2n的排列，满足条件：

思路
乍一看这个式子很吓人，但是其实我们读懂它的含义后就不难理解，第一个和式表示的是所有奇数位后一位（偶数位）的差值的绝对值之和，
第二个和式表示的是每个奇数位和后一位（偶数位）的差值的和的绝对值。

对于绝对值，我们通常的想法是能不能使得内部为正数，从而消除掉绝对值。

对于构造题，我们通常的思路是构造一些常见的数组，比如这里要构造排列，我们可以考虑构造顺序排列、倒序排列、左右横跳的排列。

我们发现“倒序排列”时，绝对值符号正好可以消除，这两个和式的结果相等，相减的结果为0，这是一个很重要的特性。

现在在“倒序排列”的基础上，我们发现每颠倒一对
a2i−1和ai，就可以使得题目式子的差增加2。
因为此时第一个和式的结果没变化，第二个和式从
1变为−1，也就是说整体会从减1变为减−1。
并且题目数据保证0≤2k≤n，保证了第二个和式内部不会变为负数。
于是我们只需要先构造“倒序排列”然后进行k次颠倒即可。

输入
第一行包含两个整数 n 和 k（1 ≤ n ≤ 50000，0 ≤ 2k ≤ n）。
输出
打印 2n 个整数 a1, a2, ..., a2n - 所需的排列组合 a。如果有多个解，可以打印任意一个。

Examples
InputCopy
1 0
OutputCopy
1 2

InputCopy
2 1
OutputCopy
3 2 1 4

InputCopy
4 0
OutputCopy
2 7 4 6 1 3 5 8

注释
记录 |x| 表示数 x 的绝对值。
在第一个样本中 |1 - 2| - |1 - 2| = 0。
在第二个样本中 |3 - 2| + |1 - 4| - |3 - 2 + 1 - 4| = 1 + 3 - 2 = 2。
在第三个样本中，|2 - 7| + |4 - 6| + |1 - 3| + |5 - 8| - |2 - 7 + 4 - 6 + 1 - 3 + 5 - 8| = 12 - 12 = 0。

*/


#include <iostream>


using namespace std;

const int N = 100010;
int a[N];
int n, k;

int main()
{
	cin >> n >> k;
	for (int i = 1; i <= 2 * n; i++) {
		a[i] = 2 * n - i + 1;
	}
	for (int i = 1; i <= k; i++) {
		swap(a[2 * i - 1], a[2 * i]);
	}

	for (int i = 1; i <= 2 * n; i++) {
		cout << a[i] << " ";
	}


	return 0;
}

 